/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpb.projetoesa.negocio;

import br.ufpb.projetoesa.exceptions.DisciplinasVaziaException;
import java.util.ArrayList;
import java.util.List;
import br.ufpb.projetoesa.exceptions.DisciplinaInexistenteException;
import br.ufpb.projetoesa.exceptions.DisciplinaInvalidaException;

/**
 *
 * @author leonardo
 */
public class Curso {

    private String ID;
    private int cargaHoraria;
    private String nome;
    private List<Disciplina> disciplinas;
    
    
    /* Construtor: força o usuário a entrar no mínimo com o nome, pois o ID será gerado
     automaticamente. */
    public Curso(String id, String nome){
        this(id, nome, 0);
    }
    
    
    /* Construtor: caso queira especificar todos os atributos */
    public Curso(String id, String nome, int ch){
        this.ID = id;
        this.nome = nome;
        this.cargaHoraria = ch;
        this.disciplinas = new ArrayList<Disciplina>();
    }
    
    
    /* ATENÇÃO: implementação provisória, pois a responsabilidade dest método é de Sabrina */
    // e deve existir alguma restrição aqui, eu acho.
    public void addDisciplina(Disciplina d) throws DisciplinaInvalidaException{
        if (d != null)
            disciplinas.add(d);
        else
            throw new DisciplinaInvalidaException("O correu um erro ao tentar cadastrar a nova Disciplina.");
    }
    
    /**
     * Adiciona uma nova Disciplina neste Curso
     */
    public void addDisciplina(String id, String nome){
        addDisciplina(id, nome, 0);
    }
    
    /**
     * Adiciona uma nova Disciplina neste Curso
     */
    public void addDisciplina(String id, String nome, int creditos) throws DisciplinaInvalidaException{ 
        if (id != null && nome != null){
            Disciplina d = new Disciplina(id, nome, creditos);
            this.disciplinas.add(d);
        } else {
            throw new DisciplinaInvalidaException("O correu um erro ao tentar cadastrar a nova Disciplina.");
        }        
    }
    
    
    /**
     * Reutiliza o método que retorna uma disciplina com o seu ID e
     * envia para o método que remove uma disciplina sem precisar
     * percorrer a lista novamente.
     */
    public void removerDisciplinaID(String id) throws DisciplinaInexistenteException {
        removerDisciplina(this.getDisciplinaID(id));
    }
    
    
    /**
     * Remove uma disciplina deste curso.
     */
    public void removerDisciplina(Disciplina disc) throws DisciplinaInexistenteException,
            DisciplinasVaziaException {

        if (disciplinas.isEmpty()) {
            throw new DisciplinasVaziaException("Não existe nenhuma disciplina cadastrada.");
        } else {
            if (disciplinas.contains(disc)) {
                disciplinas.remove(disc);
            } else {
                throw new DisciplinaInexistenteException("Não foi possível remover esta disciplina,"
                        + "verifique e tente novamente.");
            }
        }

    }
    
    /**
     * Percorre toda a lista de disciplinas contidas nesta classe veificando
     * se existe alguma disciplina com o ID recebido, se encontrar, retorna
     * a Disciplina, caso contrário, lença uma exceção.
     */
    public Disciplina getDisciplinaID(String id) throws DisciplinaInexistenteException{
        for(Disciplina d: this.disciplinas){
            if (d.getID().equals(id)){
                return d;
            }
        }
        throw new DisciplinaInexistenteException("Não existe disciplina com a identificação " + id);
    }
    
    public List<Disciplina> getDisciplinas(){
        return this.disciplinas;
    }
    
    public String getCursoID(){
        return this.ID;
    }
    
    public void atualizaDisciplina(Disciplina disciplinaAtual, Disciplina disciplinaModificada) throws DisciplinaInexistenteException{
        
        
        if(disciplinaAtual != null && disciplinaModificada != null){
            
            for (Disciplina disciplina: this.disciplinas) {
            
                if(disciplina.equals(disciplinaAtual)){
                    this.disciplinas.remove(disciplinaAtual);
                    this.disciplinas.add(disciplinaModificada);
                    return;
                }
            
            }
            
            throw new DisciplinaInexistenteException("Essa Disciplina não existe, tente novamente");
        
        }else {
            throw new DisciplinasVaziaException("Essa disciplina está vazia");    
        }
        
        
    }

    public int getCargaHorariaCurso() {
        return cargaHoraria;
    }

    public String getNomeCurso() {
        return nome;
    }
    
    
}